home *** CD-ROM | disk | FTP | other *** search
/ Megahits 3 / Megahits 3 (1994)(GTI - Rhein-Main-Soft)(DE)[!].iso / module / utilities / midi / io_mt32.lha / banksender.c < prev    next >
C/C++ Source or Header  |  1993-08-12  |  7KB  |  324 lines

  1. #include <exec/types.h>
  2. #include <exec/ports.h>
  3. #include <exec/devices.h>
  4. #include <exec/memory.h>
  5. #include <exec/interrupts.h>
  6. #include <exec/nodes.h>
  7. #include <exec/lists.h>
  8. #include <exec/libraries.h>
  9. #include <exec/tasks.h>
  10. #include <exec/execbase.h>
  11. #include <exec/io.h>
  12. #include <exec/resident.h>
  13. #include <exec/execname.h>
  14. #include <exec/exec.h>
  15. #include <exec/errors.h>
  16. #include <exec/alerts.h>
  17. #include <devices/serial.h>
  18. #include <stdio.h>
  19. #include <ctype.h> 
  20.  
  21.  
  22. /* Resource allocation bits */
  23.  
  24. #define SERIAL_PORT    (1 << 0)
  25. #define SERIAL_EXTIO    (1 << 1)
  26. #define SERIAL_DEVICE    (1 << 2)
  27. #define TIMER_PORT    (1 << 3)
  28. #define TIMER_EXTIO    (1 << 4)
  29. #define TIMER_DEVICE    (1 << 5)
  30. #define ICR_VECTOR    (1 << 6)
  31. #define ARRAY_ALLOCATED    (1 << 7)
  32.  
  33.  
  34.  
  35. /* MIDI end-system-exclusive byte */
  36.  
  37. #define END_SYSTEM_EXCLUSIVE    0xF7
  38.  
  39. #define MIDI_STATUS_MASK    0x80
  40.  
  41. /* Routine declarations */
  42.  
  43. extern struct MsgPort *CreatePort();
  44. extern struct IORequest *CreateExtIO();
  45.  
  46. LONG ReadToneData();
  47.  
  48. /* Serial device structures */
  49.  
  50. struct IOExtSer *IORser;
  51. struct MsgPort *serialport;
  52.  
  53. UBYTE tonedata[254];
  54.  
  55. int channel,patchg,patchn,parameter,address,timbre,resources=0;
  56. int i,cort,channum,notenum;
  57. char filename[80];
  58.  
  59. main(argc,argv)
  60. int argc;
  61. char *argv[];
  62. {
  63. int error,x,xx;
  64.  
  65. /* Create a message port for the serial device */
  66.  
  67. serialport = CreatePort(SERIALNAME,0);
  68. if (serialport == NULL) Cleanup("Unable to CreatePort serial",100);
  69.  
  70.  
  71. /* Create an I/O request block for the serial device */
  72.  
  73. IORser = (struct IOExtSer *)
  74.     CreateExtIO(serialport, sizeof(struct IOExtSer));
  75.  
  76. if (IORser == NULL) Cleanup("Unable to CreateExtIO serial",200);
  77.  
  78. resources |= SERIAL_EXTIO;
  79.  
  80. /* Open the serial device */
  81.  
  82. if ((error = OpenDevice(SERIALNAME,0,IORser,0))!= 0)
  83.     Cleanup("Unable to open serial device",error);
  84.  
  85. resources |= SERIAL_DEVICE;
  86.  
  87. /* Set serial device parameters for MIDI communications */
  88.  
  89. if ((error = SetParams(IORser)) != 0)
  90.     Cleanup("Unable to set serial parameters",error);
  91.     if (argc)   {
  92.         for (x=0;x<argc-1;x++) {
  93.             ReadToneData(argv[x+1]);
  94.             SendToneData (tonedata,x);
  95.             SendToneData (tonedata,x+argc-1);
  96.             for(xx=0;xx<5000;xx++);
  97.             ModifyPatchData(x+1,5,0,2);
  98.             ModifyPatchData(x+1,5,1,x);
  99.             ModifyPatchData(x+argc,5,0,2);
  100.             ModifyPatchData(x+argc,5,1,x+argc-1);
  101.             ModifyPatchData(x+argc,5,6,0);
  102.             printf("Sending %s\n",tonedata);
  103.         }
  104.     }
  105.     Cleanup ("", 0);
  106. }
  107.  
  108. SendToneData (filedata,timbre)
  109. UBYTE timbre,*filedata[];
  110.  
  111. {
  112. /* Receive request 1 system exclusive */
  113.  
  114. static UBYTE receivearray [] = {0xF0,0x41,0x10,0x16,0x12};
  115. UBYTE receive_request[265];    
  116.  
  117. UBYTE checksum=0;
  118. UBYTE *ptr;
  119.  
  120. int i,addSB,addLSB;
  121.  
  122. /* Clear the serial buffer of any unread data */
  123.  
  124. IORser->IOSer.io_Command = CMD_CLEAR;
  125. DoIO (IORser);
  126.  
  127. for (i=0;i<5;i++) receive_request[i]=receivearray[i];
  128. i = timbre * 0x0200; 
  129. addSB=(i>>8);    addLSB=((i<<4)>>4);
  130. receive_request[5]=8;receive_request[6]=addSB;receive_request[7]=addLSB;
  131. ptr = (UBYTE *) filedata;
  132.  
  133. for (i=8; i<254; i++)
  134.     {
  135.     receive_request[i] = *ptr;
  136.     checksum += receive_request[i];
  137.     ptr++;
  138.     }
  139. for (i=5;i<8;i++)  {
  140.     checksum += receive_request[i];
  141.             }
  142.    checksum=checksum%256;
  143.    if (checksum<=128) checksum=128-checksum;    
  144.    else if (checksum<256) checksum=256-checksum;
  145.    
  146. /* Add "end-system-exclusive" to tone data buffer */
  147.  
  148. receive_request[254] = checksum;
  149. receive_request[255]= END_SYSTEM_EXCLUSIVE;
  150.  
  151. /* Send tone data to MT-32 */
  152.  
  153. IORser->IOSer.io_Data = (APTR) &receive_request;
  154. IORser->IOSer.io_Length = 256;
  155. IORser->IOSer.io_Command = CMD_WRITE;
  156.  
  157. DoIO (IORser);
  158.  
  159. }
  160.  
  161. /* Write tone data to file */
  162.  
  163.  
  164. /* Read tone data from file */
  165.  
  166. LONG ReadToneData (filename)
  167. char *filename[];
  168. {
  169. FILE *fileptr;
  170.  
  171.  
  172. do    {
  173.     fileptr = fopen (filename, "r");
  174.     }
  175. while (fileptr == NULL);
  176.  
  177. /* Read tone data from file */
  178.  
  179. fread (tonedata, 2546, 1, fileptr);
  180.  
  181. fclose (fileptr);
  182.  
  183.  
  184. return (TRUE);
  185. }
  186.  
  187. /* Set serial device parameters */
  188.  
  189. SetParams (io)
  190. struct IOExtSer *io;
  191. {
  192.  
  193. /* Set serial port for MIDI communications */
  194.  
  195. io->io_SerFlags = SERF_RAD_BOOGIE;
  196. io->io_Baud = 31250;
  197. io->IOSer.io_Command = SDCMD_SETPARAMS;
  198.  
  199. return(DoIO(io));
  200. }
  201.  
  202. /* Cleanup and exit routine */
  203.  
  204. Cleanup (str, n)
  205. char *str;
  206. int n;
  207. {
  208.  
  209. if (strlen(str) != 0) printf ("%s", str);
  210. if (n != 0) printf (", error = %ld", n);
  211. if (strlen(str) != 0) printf ("\n"); 
  212.  
  213. /* Release all resources */
  214.  
  215. if (resources & SERIAL_DEVICE) {
  216.     /* Reset the serial device and then close it */
  217.     IORser->IOSer.io_Command = CMD_RESET;
  218.     DoIO (IORser);
  219.     CloseDevice (IORser); }
  220. if (resources & SERIAL_EXTIO)
  221.     DeleteExtIO(IORser, sizeof(struct IOExtSer));
  222. if (resources & SERIAL_PORT) DeletePort (serialport);
  223.  
  224. exit(n);
  225.  
  226. }
  227.  
  228.     
  229.  
  230.  
  231. ModifyPatchData (channel,address,parameter,patchn)
  232. UBYTE channel,address,parameter,patchn;
  233. {
  234. UBYTE addSB,addLSB,checksum=0;
  235.  
  236. /* Send Request 1 system exclusive data */
  237. UBYTE sendrequest[11];
  238. static UBYTE sendarray[5] = {0xF0,0x41,0x10,0x16,0x12};
  239.  
  240. int i;
  241. for (i=0;i<5;i++) sendrequest[i]=sendarray[i];
  242. sendrequest[5]=address;
  243. if (address==3) {
  244.     i = (channel-1) * 0x10 + parameter; 
  245.     }
  246. if (address==5) {
  247.     i = (channel-1) * 0x08 + parameter; 
  248.     }
  249. if (address==8)    i = (channel-1) * 0x0200 + parameter;
  250. if (address==10) goto ten;
  251.  
  252. addSB=(i>>8);addLSB=((i<<4)>>4);
  253. sendrequest[6]=addSB;sendrequest[7]=addLSB;
  254.     
  255.     ten:
  256.         if (address==10) {
  257.             sendrequest[5]=0x10;
  258.             sendrequest[6]=0;
  259.             sendrequest[7]=parameter;
  260.         }
  261.         
  262. sendrequest[8]=patchn;
  263. for (i=5;i<9;i++)  {
  264.     checksum += sendrequest[i];
  265.             }  
  266.    checksum = checksum%256;
  267.    if (checksum<=128) checksum = 128-checksum;    
  268.    else if (checksum<256) checksum = 256-checksum;
  269. sendrequest[9]=checksum;
  270. sendrequest[10]=0xF7;
  271.  
  272. /* Clear the serial buffer of any unread data */
  273.  
  274. IORser->IOSer.io_Command = CMD_CLEAR;
  275. DoIO (IORser);
  276.  
  277. /* Send request to MT-32 */
  278.  
  279. IORser->IOSer.io_Data = (APTR) &sendrequest;
  280. IORser->IOSer.io_Length = sizeof(sendrequest);
  281. IORser->IOSer.io_Command = CMD_WRITE;
  282.  
  283. DoIO(IORser);
  284.     
  285. }
  286.  
  287. SendPatchData (channel,patchg,patchn)
  288. UBYTE channel,patchg,patchn;
  289. {
  290. UBYTE checksum=0;
  291.  
  292. /* Send Request 1 system exclusive data */
  293. UBYTE sendrequest[12];
  294. static UBYTE sendarray[5] = {0xF0,0x41,0x10,0x16,0x12};
  295.  
  296. int i;
  297. for (i=0;i<5;i++) sendrequest[i]=sendarray[i];
  298. i = (channel-1) * 0x010;
  299. sendrequest[5]=3;sendrequest[6]=0;sendrequest[7]=i;
  300. sendrequest[8]=patchg;sendrequest[9]=patchn;
  301. for (i=5;i<10;i++)  {
  302.     checksum += sendrequest[i];
  303.             }  
  304.    checksum = checksum%256;
  305.    if (checksum<=128) checksum = 128-checksum;    
  306.    else if (checksum<256) checksum = 256-checksum;
  307. sendrequest[10]=checksum;
  308. sendrequest[11]=0xF7;
  309.     
  310. /* Clear the serial buffer of any unread data */
  311.  
  312. IORser->IOSer.io_Command = CMD_CLEAR;
  313. DoIO (IORser);
  314.  
  315. /* Send request to MT-32 */
  316.  
  317. IORser->IOSer.io_Data = (APTR) &sendrequest;
  318. IORser->IOSer.io_Length = sizeof(sendrequest);
  319. IORser->IOSer.io_Command = CMD_WRITE;
  320.  
  321. DoIO(IORser);
  322.     
  323. }
  324.